package com.munhrasoft.dinamica.business.logic;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import com.munhrasoft.dinamica.business.entities.CheckListHeader;
import com.munhrasoft.dinamica.business.entities.CheckListLines;
import com.munhrasoft.dinamica.business.entities.Sistema;

import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.read.biff.BiffException;

/**
 * Esta classe vai ser executada apenas uma vez quando o sistema for instalado no cliente esta
 * classe vai carregar todos os parametros iniciais do sistema
 * 
 * @author vntraal
 * 
 */

@Stateless
public class PrimeiraCargaEJB {

    @EJB
    private GrupoUsuarioEJB grupoUsuarioEJB;
    @EJB
    private ParametrosEJB   parametrosEJB;
    @EJB
    private CustoCNotasEJB  custoCNotasEJB;
    @EJB
    private CustoCRIEJB     custoCRIEJB;
    @EJB
    private CheckListEJB    checkListEJB;
    @EJB
    private GrupoPassosEJB  grupoPassosEJB;
    @EJB
    private SistemaEJB      sistemaEJB;

    private static Workbook wk;
    public static final int HEADER_LINES = 5;

    public void executaCargaParams() {
        // so carrega os dados se for a primeira vez
        if (isFirstSystemLoad()) {
            parametrosEJB.carregaParametrosDefault();
            grupoPassosEJB.carregaGrupoPadrao();
            grupoUsuarioEJB.CarregaGrupoPadrao();
            carregaCheckListDefault();
            carregaTabelasCartorio();
        }

    }

    /**
     * Verifica se e a primeira vez que o sistema esta sendo usado
     * 
     * @return
     */
    private boolean isFirstSystemLoad() {

        List<Sistema> sistema = sistemaEJB.fetchAllSistema();

        if (sistema.isEmpty()) {

            Sistema novoSistema = new Sistema();
            novoSistema.setDataprimeiracarga(new Date());
            novoSistema.setPrimeiracarga(true);
            sistemaEJB.createSistema(novoSistema);
            return true;
        } else {
            return false;
        }

    }

    /**
     * Carrega os checklists que ja estao na aplicacao
     */
    private void carregaCheckListDefault() {

        WorkbookSettings ws = new WorkbookSettings();
        ws.setEncoding("Cp1252");
        try {
            wk = Workbook.getWorkbook(new File("./src/test/resources/CheckLists.xls"), ws);
        } catch (BiffException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // initContainer();
        System.out.println("Numero de abas " + wk.getSheets().length);
        String tituloGrupo = new String();

        for (int abaCount = 0; abaCount < wk.getNumberOfSheets(); abaCount++) {

            CheckListHeader chkHeader = new CheckListHeader();
            chkHeader.setCheckLines(new ArrayList<CheckListLines>());
            Sheet chkSheet = wk.getSheets()[abaCount];
            chkSheet.getCell(0, 0).getContents();
            System.out.println("Titulo " + chkSheet.getCell(0, 0).getContents());
            chkHeader.setTitulo(chkSheet.getCell(0, 0).getContents());

            System.out.println("Operacao " + chkSheet.getCell(1, 1).getContents());
            System.out.println("Tipo " + chkSheet.getCell(1, 2).getContents());
            System.out.println("Modalidade1 " + chkSheet.getCell(1, 3).getContents());
            System.out.println("Modalidade2 " + chkSheet.getCell(1, 4).getContents());

            chkHeader.setOperacao(chkSheet.getCell(1, 1).getContents());
            chkHeader.setTipo(chkSheet.getCell(1, 2).getContents());
            chkHeader.setModalidade1(chkSheet.getCell(1, 3).getContents());
            chkHeader.setModalidade2(chkSheet.getCell(1, 4).getContents());

            checkListEJB.createChkHeader(chkHeader);

            int linesCount = HEADER_LINES;

            while (linesCount < chkSheet.getRows()) {

                CheckListLines chkLine = new CheckListLines();

                if ("GRUPO".equals(chkSheet.getCell(1, linesCount).getContents())) {
                    tituloGrupo = new String(chkSheet.getCell(0, linesCount).getContents());
                    chkLine.setDescricao(chkSheet.getCell(0, linesCount + 1).getContents());
                    linesCount = linesCount + 2;
                } else {
                    chkLine.setDescricao(chkSheet.getCell(0, linesCount).getContents());
                    linesCount++;
                }

                chkLine.setGrupo(tituloGrupo);

                System.out.println("Grupo " + chkLine.getGrupo());
                System.out.println("Descricao " + chkLine.getDescricao());

                checkListEJB.addCheckLine(chkHeader, chkLine);

            }

            checkListEJB.updateCheckListHeader(chkHeader);
        }
    }

    /**
     * Este metodo vai carregar as duas tabelas de custos uma para o calculo do CRI e outra para o
     * calculo do Cartorio de notas
     */
    private void carregaTabelasCartorio() {
        // depois tem que achar um jeito de usar os mesmos metodos
        // so que com upload dos arquivos

        custoCRIEJB.reloadCustoCRINotas("./src/test/resources/CustoCRI.xls");
        custoCNotasEJB.reloadCustoCNotas("./src/test/resources/CustoCNotas.xls");
    }

}
